package rtool

import (
	"strings"
)

// CutStringByIndex 截取字符串，根据指定的开始下标和结束下标
// src:切片源
// start:开始下标，第一个为0
// end:结束位置，注意不包含结束的下标元素
func CutStringByIndex(src string, start int, end int) string {
	if start <= -1 {
		start = 0
	}
	if end <= start {
		return ""
	}
	length := len(src)
	if length <= start {
		return ""
	}
	if length >= end {
		return src[start:]
	}
	return src[start:end]
}

// CutSplitByIndex 截取切片，根据指定的开始下标和结束下标
// src:切片源
// start:开始下标，第一个为0
// end:结束位置，注意不包含结束的下标元素
func CutSplitByIndex[T IntUintBoolByteStringFloat](src []T, start int, end int) []T {
	if start <= -1 {
		start = 0
	}
	if end <= start {
		return []T{}
	}
	length := len(src)
	if length <= start {
		return []T{}
	}
	if length >= end {
		return src[start:]
	}
	return src[start:end]
}

// CutSplitByPage 截取切片，根据指定的页码和大小
// src:切片源
// page:页码，如果输入为0，则自动提升为1.
// size:页大小
func CutSplitByPage[T IntUintBoolByteStringFloat](src []T, page uint, size uint) []T {
	if page <= 0 {
		page = 1
	}
	start := (page - 1) * size //计算开始位置
	end := page * size         //计算结束位置
	if start > uint(len(src)) || end < start {
		return nil
	}
	if end > uint(len(src)) {
		return src[start:]
	}
	return src[start:end]
}

// CutStringBySubString 截取字符串，根据指定的开始子串和结束子串。如果不存在则返回空字符串。
// src:源字符串
// start:开始子串，如果 start 为空，则返回 end 前面那段。
// end:结束子串，如果 end 为空，则返回 start 后面那段。
// 如果 start 和 end 都为空，则返回原字符串 src 。
func CutStringBySubString(src string, start string, end string) string {
	if start == "" && end == "" {
		return src
	}
	if start == "" {
		before, _, _ := strings.Cut(src, end)
		return before
	}
	if end == "" {
		_, after, _ := strings.Cut(src, start)
		return after
	}
	_, after, found := strings.Cut(src, start)
	if found {
		before, _, f := strings.Cut(after, end)
		if f {
			return before
		}
	}
	return ""
}
